/**
 * @file    If_do.c
 * @brief   驱动管理-do输出
 * @author  Liuwei
 * @version 1.0.1
 * @date    2023-04-22
 * 
 * @copyright Copyright (c) 2023 JBD-Energy Storage Technology Co. LTD
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version   <th>Author   <th>Description
 * <tr><td>2023-04-22 <td>1.0.1     <td>Liuwei   <td>首次创建
 * </table>
 */

/* includes ------------------------------------------------------------------*/
#include "If_do.h"
#include "drv_gpio.h"
/* macro/define --------------------------------------------------------------*/
#define INIT_UDF          (0xff)  /* !< 不初始化状态 */
/* typedef -------------------------------------------------------------------*/
typedef struct 
{
    uint8_t is_init ; /* !< 是否初始化 TRUE 初始化 FALSE 不初始化*/
    uint8_t init_state ; /* !<初始状态 */
    uint8_t on_state ;   /* !< 开启时候状态 */
    GPIO_PORT port;
    GPIO_PIN pin;
}do_map_type;
/* local functions -----------------------------------------------------------*/

/* static variables ----------------------------------------------------------*/
static const do_map_type do_map_list[DO_ID_MAX] = 
{
    {TRUE , GPIO_SET  , GPIO_SET   ,  ADDR_DO_PORT , ADDR_DO_PIN  } ,
    {TRUE , GPIO_SET  , GPIO_RESET ,  LED_SOC1_PORT, LED_SOC1_PIN } ,
    {TRUE , GPIO_SET  , GPIO_RESET ,  LED_SOC2_PORT, LED_SOC2_PIN } ,
    {TRUE , GPIO_SET  , GPIO_RESET ,  LED_SOC3_PORT, LED_SOC3_PIN } ,
    {TRUE , GPIO_SET  , GPIO_RESET ,  LED_SOC4_PORT, LED_SOC4_PIN } ,
    {TRUE , GPIO_SET  , GPIO_RESET ,  LED_SOC5_PORT, LED_SOC5_PIN } ,
    {TRUE , GPIO_SET  , GPIO_RESET ,  LED_SOC6_PORT, LED_SOC6_PIN } ,
    {TRUE , GPIO_SET  , GPIO_RESET ,  LED_MOS_PORT , LED_MOS_PIN  } ,
    {TRUE , GPIO_SET  , GPIO_RESET ,  LED_ALM_PORT , LED_ALM_PIN  } ,
    {TRUE , GPIO_SET  , GPIO_RESET ,  LED_RUN_PORT , LED_RUN_PIN  } ,
    {TRUE , GPIO_RESET  , GPIO_SET ,  RLY_PORT_PORT, RLY_PORT_PIN } ,
    {TRUE , GPIO_RESET  , GPIO_SET ,  RLY_SOCL_PORT, RLY_SOCL_PIN } ,
    {TRUE , GPIO_RESET  , GPIO_SET ,  SYS_RLED_PORT, SYS_RLED_PIN } ,
    {TRUE , GPIO_SET    , GPIO_SET ,  SYS_POW_PORT , SYS_POW_PIN  } ,
    {TRUE , GPIO_SET    , GPIO_SET ,  DCDC_EN_PORT , DCDC_EN_PIN  } ,
    {TRUE , GPIO_SET    , GPIO_SET ,  BL_POW_PORT   , BL_POW_PIN  } ,
    {TRUE , GPIO_SET    , GPIO_SET ,  LCD_POW_PORT  , LCD_POW_PIN  } ,
    {TRUE , GPIO_RESET  , GPIO_SET ,  LIMIT_10A_PORT , LIMIT_10A_PIN} ,
    {TRUE , GPIO_RESET  , GPIO_SET ,  CAN_RES_PORT , CAN_RES_PIN } , 
    {TRUE , GPIO_RESET  , GPIO_SET ,  FAN_MOS_PORT , FAN_MOS_PIN } ,
    {TRUE , GPIO_RESET  , GPIO_SET ,  HOT_MOS_PORT , HOT_MOS_PIN } ,
    {TRUE , GPIO_RESET  , GPIO_SET ,  SPRO_PORT    , SPRO_PIN    } ,
    {TRUE , GPIO_RESET  , GPIO_SET ,  PRE_CHG_PORT , PRE_CHG_PIN } ,
    {TRUE , GPIO_RESET  , GPIO_SET ,  CHG_EN_PORT    , CHG_EN_PIN    } ,
    {TRUE , GPIO_RESET  , GPIO_SET ,  DSG_EN_PORT    , DSG_EN_PIN    } ,
    {TRUE , GPIO_RESET  , GPIO_SET ,  BAT_SMP_EN_PORT , BAT_SMP_EN_PIN } ,
//	{TRUE , GPIO_RESET  , GPIO_SET ,  BEEP_CTRL_PORT , BEEP_CTRL_PIN },
    {TRUE , GPIO_SET    , GPIO_SET , NTC_POW_PORT , NTC_POW_PIN },
	{TRUE , GPIO_RESET  , GPIO_SET , LIMIT_5A_PORT , LIMIT_5A_PIN } ,
};

/* global variables ----------------------------------------------------------*/

/** ------------------------------------------------------------------------- *
  *                             Global function
 ** ------------------------------------------------------------------------- */
void If_do_init_all(void)
{
    uint8_t i = 0;
    for( i = 0;i < DO_ID_MAX; ++ i)
    {
        if((TRUE == do_map_list[i].is_init) && (NULL != do_map_list[i].port))
        {
            drv_gpio_cfg_mode(do_map_list[i].port , do_map_list[i].pin , GPIO_MODE_OUTPUT);
            if(GPIO_SET == do_map_list[i].init_state)
                drv_gpio_set_pin(do_map_list[i].port , do_map_list[i].pin);
            else
                drv_gpio_reset_pin(do_map_list[i].port , do_map_list[i].pin);
        }
    }
}

/**
 * @brief  初始化单个输出
 * @param  do_id : 输出 ID
 * @param  set_state : 输出状态
 */
void If_do_init_id(do_id_type do_id , do_state_type set_state)
{
    if(do_id >= DO_ID_MAX)
        return ;
	
	if(NULL != do_map_list[do_id].port)
		return ;

    drv_gpio_cfg_mode(do_map_list[do_id].port , do_map_list[do_id].pin,GPIO_MODE_OUTPUT);

    If_do_set_output(do_id , set_state);
}
/**
 * @brief  
 * @param  do_id
 * @param  set_do
 */
void If_do_set_output(do_id_type do_id , do_state_type set_state)
{
    if(do_id >= DO_ID_MAX)
        return ;
	
	if(NULL == do_map_list[do_id].port)
		return ;
	
    if(((GPIO_SET == do_map_list[do_id].on_state) && (DO_OUT_ON == set_state))
        ||((GPIO_RESET == do_map_list[do_id].on_state) && (DO_OUT_OFF == set_state)))
        drv_gpio_set_pin(do_map_list[do_id].port , do_map_list[do_id].pin);
    else
        drv_gpio_reset_pin(do_map_list[do_id].port , do_map_list[do_id].pin);
}

/**
 * @brief  获取DO输出状态
 * @param  do_id : ID 
 * @return do_state_type 
 *         DO_OUT_ON : 表示打开
 *         DO_OUT_OFF : 关闭
 */
do_state_type If_do_get_out_state(uint8_t do_id)
{
    if(GPIO_SET == do_map_list[do_id].on_state)
    {
        if(GPIO_SET == drv_gpio_read_out_pin(do_map_list[do_id].port , do_map_list[do_id].pin))
            return DO_OUT_ON;
        else
            return DO_OUT_OFF;
    }
    else
    {
        if(GPIO_SET == drv_gpio_read_out_pin(do_map_list[do_id].port , do_map_list[do_id].pin))
            return DO_OUT_OFF;
        else
            return DO_OUT_ON;
    }
}

/** ------------------------------------------------------------------------- *
  *                              Local function
 ** ------------------------------------------------------------------------- */
 
/********** Copyright (c) 2023 JBD-Energy Storage Technology Co. LTD *********/


